package org.address;

import org.junit.Test;

/**
 * ClassName: AddressCalc
 * Package: org.address
 * Description:
 *
 * @Author BuTang
 * @Create 2023/11/23 16:08
 * @Version 1.0
 */
public class AddressCalc {

    /**
     * 从上到下分别为
     * 地球半径
     * 每一圈镜子之间的间隔随着远离吸热塔，增加间隔
     * 第一圈镜子到吸热塔的距离
     * 吸热塔的经度
     * 吸热塔的纬度
     */
    private static final double EARTH_RADIUS = 6378137;
    private static final double MIRROR_MIRROR_INTERVAL = 0.04;
    private static final double MIRROR_TOWER_INTERVAL = 60;
    private static final double TOWER_LONGITUDE = 94.252903;
    private static final double TOWER_LATITUDE = 40.034251;

    @Test
    public  void getAddress(){
        AddressEntity address = calculateCoordinate(TOWER_LONGITUDE, TOWER_LATITUDE, -60, 0);
        double latitude = address.latitude;
    }

    //校验
    @Test
    public void test(){

        // 第一个点的纬度,经度
        double lat1 = 40.034295;
        double lon1 = 94.252364;
        // 第二个点的纬度,经度
        double lat2 = 40.034295;
        double lon2 = 94.252303;


        // 第三个点的纬度,经度
        double lat3 = 40.034103;
        double lon3 = 94.245402;
        // 第四个点的纬度,经度
        double lat4 = 40.034103;
        double  lon4 = 94.245317;

        calculateCoordinate(40.034103,94.245402,0,-9.64);
    }


    public static double getDistance1(double longitude1, double latitude1, double longitude2, double latitude2) {
        // 纬度
        double lat1 = Math.toRadians(latitude1);
        double lat2 = Math.toRadians(latitude2);
        // 经度
        double lng1 = Math.toRadians(longitude1);
        double lng2 = Math.toRadians(longitude2);
        // 纬度之差
        double a = lat1 - lat2;
        // 经度之差
        double b = lng1 - lng2;
        // 计算两点距离的公式
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
        // 弧长乘地球半径, 返回单位: 米
        s =  s * EARTH_RADIUS;
        return s;
    }



    public static AddressEntity calculateCoordinate(double lonA, double latA, double lonDiff, double latDiff) {



        // 将点 A 的经度转换为弧度
        double lonARad = Math.toRadians(lonA);
        // 经度方向上的差值（弧度）
        double lonDelta = lonDiff / EARTH_RADIUS ;
        // 计算点 B 的经度（弧度）
        double lonBRad = lonARad + lonDelta;

        // 将点 A 的纬度转换为弧度
        double latARad = Math.toRadians(latA);
        // 纬度方向上的差值（弧度）
        double latDelta = latDiff / EARTH_RADIUS;
        // 计算点 B 的纬度（弧度）
        double latBRad = latARad + latDelta;



        // 将纬度转换为度数
        double latB = Math.toDegrees(latBRad);
        // 将经度转换为度数
        double lonB = Math.toDegrees(lonBRad);

        return new AddressEntity(latA,lonB);
    }

    @Test
    public void test3(){
        calculateCoordinate(TOWER_LONGITUDE,TOWER_LATITUDE,-60,0);

    }


}
